package com.itany;

import java.util.ArrayList;
import java.util.function.Supplier;

/**
 * Author：汤小洋
 * Date：2022-10-26 11:19
 * Description：<描述>
 */
public class Test05_方法引用 {
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student(43));
        students.add(new Student(13));
        students.add(new Student(25));

        // 使用匿名内部类
        // students.sort(new Comparator<Student>() {
        //     @Override
        //     public int compare(Student o1, Student o2) {
        //         return o1.age - o2.age;
        //     }
        // });

        // 使用Lambda表达式
        // students.sort((o1,o2) -> o1.age-o2.age);

        /**
         * 1.静态方法引用（类名::静态方法名）
         */
        // compare是静态方法，其参数列表与java.util.Comparator接口的compare参数列表一致
        // students.sort(Student::compare);

        /**
         * 2.实例方法引用（对象名::实例方法名）
         */
        // compare是实例方法，其参数列表与java.util.Comparator接口的compare参数列表一致
        // Student stu = new Student();
        // students.sort(stu::compare);

        /**
         * 3.类的实例方法引用（类名::实例方法名）
         */
        // compare是实例方法，java.util.Comparator接口的compare参数列表中的第一个参数被省略（通过this来表示）
        // students.sort(Student::compare);

        /**
         * 4.构造方法引用（类名::new）
         */
        // 使用匿名内部类
        // createStudent(new Supplier<Student>() {
        //     @Override
        //     public Student get() {
        //         return new Student();
        //     }
        // });

        // 使用Lambda表达式
        // createStudent(() -> new Student());

        createStudent(Student::new);


        // System.out.println(students);
    }

    public static void createStudent(Supplier<Student> supplier){
        Student s = supplier.get();
        System.out.println(s);
    }

}

class Student {
    int age;

    public Student() {
        System.out.println("Student.Student");
    }

    public Student(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                "}\n";
    }

    // 静态方法
    // public static int compare(Student s1, Student s2){
    //     return s1.age -  s2.age;
    // }

    // 实例方法
    public int compare(Student s1, Student s2){
        return s1.age -  s2.age;
    }

    // 实例方法
    public int compare(Student s){
        return this.age - s.age;
    }
}
